Computing systems are providing ever more complex and sophisticated functionality. Such functionality is often primarily driven by underlying software, which itself is becoming ever more complex. Application developers have the task of developing such software, and tuning performance to ensure efficient execution. Such application developers and others might also have an interest in evaluating software performance.
Application developers have a wide variety of tools at their disposal in order to author software. First, source code allows the application developer to author software using instructions that are more understandable and intuitive to a human than is binary or intermediate code. The source code is ultimately compiled and/or interpreted into binary to allow readability of the code by a computing processor. In addition, various authoring tools allow for various visualizations that allow a developer to have a good understanding of how the application is currently functioning. For instance, some authoring tools allow a programmer to step through the execution of a program, one line of source code at a time, and evaluate the values associated to various parameters and variables. Authors might also insert temporary lines of code within the design for use in debugging.
Storage channel input/output is a major contributor to application performance. Such storage channels may be for reading from a storage medium, or in the case of a read/write medium, writing to the storage medium. The storage medium might be, for example, a CD-ROM drive, a DVD drive, a disk drive, and so forth. For instance, often applications pause while storage input/output is being performed. One of the contributing factors that makes storage input/output analysis difficult is that storage input/output involves the file system, which is usually a service of the operating system. This means that it is also difficult to trace a storage input/output request all the way through the system, making correlation to the application difficult. Another challenge is that storage input/output can result from indirect actions by the application or the operating system. For example, disk input/output can result when an application access a memory location that causes a page fault, when instructions from a dynamically linked library need to be loaded into memory, or when virtual memory operations are being performed by the operating system, and so forth.